/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package conexion;

//RmiServidor.java
import gui.HomeAdmin;
import gui.Login;


import interfaz.cargarSistema;
import interfaz.mensajeriaInstantanea;
import java.io.IOException;
import java.net.InetAddress;
import java.rmi.*;
import java.rmi.registry.*;
import java.rmi.server.*;

import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFrame;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPathExpressionException;
//import org.jvnet.substance.SubstanceLookAndFeel;
//import org.jvnet.substance.watermark.SubstanceImageWatermark;
import org.xml.sax.SAXException;
import persistencia.ConsultaEstadisticas;

/**
 * @author casidiablo
 * 
 */
public class RmiServidor extends UnicastRemoteObject implements
        cargarSistema, mensajeriaInstantanea {

    private static HomeAdmin gs;
    private ConsultaEstadisticas ce;
    private int estePuerto;
    private Login ln;
    private String estaIP;
    private Registry registro;
    private ArrayList<String> ip;
    private ArrayList<String> partidas;
    private ArrayList<Integer> puerto;
    private boolean tModalidad;

    /**
     * Este es el metodo constructor de la clase RmiServidor
     */
    public RmiServidor() throws RemoteException {
        try {
            // obtener la direccion de este host.
            estaIP = (InetAddress.getLocalHost()).toString();
        } catch (Exception e) {

            throw new RemoteException("No se puede obtener la direccion IP.");
        }
        estePuerto = 3232; // asignar el puerto que se registra
        try {

            // crear el registro y ligar el nombre y objeto.
            registro = LocateRegistry.createRegistry(estePuerto);
            registro.rebind("rmiServidor", this);
        } catch (RemoteException e) {
            throw e;
        }



        //JFrame.setDefaultLookAndFeelDecorated(true);
        //SubstanceLookAndFeel.setSkin("org.jvnet.substance.skin.CremeSkin");
        //SubstanceLookAndFeel.setCurrentWatermark("org.jvnet.substance.watermark.SubstanceBinaryWatermark");//Ejemplo de aplicacion de un watermark de Substance
        //SubstanceLookAndFeel.setCurrentWatermark(new SubstanceImageWatermark("http://72.29.81.246/~imindjav/images/HomeAdmin.jpg"));
        //SubstanceLookAndFeel.setImageWatermarkOpacity(new Float(1));
        puerto=new ArrayList<Integer>();
        puerto.add(1414);
        ip=new ArrayList<String>();
        partidas=new ArrayList<String>();
        gs = new HomeAdmin(this);
        gs.setVisible(true);
    }
//------------------------------------------------------------------//
    public void gestionServidor(boolean habilitado) throws RemoteException {
        System.out.println("TRY");
        if (habilitado == false) {
            try {

                registro.unbind("rmiServidor");
            } catch (NotBoundException ex) {
                Logger.getLogger(RmiServidor.class.getName()).log(Level.SEVERE, null, ex);
            } catch (AccessException ex) {
                Logger.getLogger(RmiServidor.class.getName()).log(Level.SEVERE, null, ex);
            }

        } else {
            registro.rebind("rmiServidor", this);
        }

    }

    public void salirSistema() {
        gs.dispose();
        ln = new Login();
        
        //JFrame.setDefaultLookAndFeelDecorated(true);
        //SubstanceLookAndFeel.setSkin("org.jvnet.substance.skin.CremeSkin");
        //SubstanceLookAndFeel.setCurrentWatermark("org.jvnet.substance.watermark.SubstanceBinaryWatermark");//Ejemplo de aplicacion de un watermark de Substance
        //SubstanceLookAndFeel.setCurrentWatermark(new SubstanceImageWatermark("http://72.29.81.246/~imindjav/images/Login.jpg"));
        //SubstanceLookAndFeel.setImageWatermarkOpacity(new Float(1));
        
        ln.setVisible(true);
    /*guiIngreso gi=new guiIngreso();
    gi.setVisible(true);*/
    }

    public String consultaDatosJugador(String usuario, String tipo) throws RemoteException {
        String aux = new String();
        ce = new ConsultaEstadisticas();
        if (tipo.equalsIgnoreCase("Globales")) {
            try {
                aux = ce.Estadisticastodos();
            } catch (ParserConfigurationException ex) {
                Logger.getLogger(RmiServidor.class.getName()).log(Level.SEVERE, null, ex);
            } catch (SAXException ex) {
                Logger.getLogger(RmiServidor.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(RmiServidor.class.getName()).log(Level.SEVERE, null, ex);
            } catch (XPathExpressionException ex) {
                Logger.getLogger(RmiServidor.class.getName()).log(Level.SEVERE, null, ex);
            }
        } else if (tipo.equalsIgnoreCase("Personales")) {
            try {
                aux = ce.entrar(usuario);
            } catch (ParserConfigurationException ex) {
                Logger.getLogger(RmiServidor.class.getName()).log(Level.SEVERE, null, ex);
            } catch (SAXException ex) {
                Logger.getLogger(RmiServidor.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(RmiServidor.class.getName()).log(Level.SEVERE, null, ex);
            } catch (XPathExpressionException ex) {
                Logger.getLogger(RmiServidor.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        return aux;


    }

    public void sesionJugador(String usuario) throws RemoteException {
        gs.getJtUsuarios().setText(gs.getJtUsuarios().getText() + '\n' + "Salio del Sistema: " + usuario);
    }

    public void recibirDatosJugador(String usuario) throws RemoteException {
        gs.getJtUsuarios().setText(gs.getJtUsuarios().getText() + '\n' + usuario);

    }

    public String nuevomsg(String usuario, String mensaje) throws RemoteException {
        gs.getJtChat().setText(gs.getJtChat().getText() + '\n' + usuario + ": " + mensaje);
        return gs.getJtChat().getText();
    }

    public String actualizar() throws RemoteException {
        return gs.getJtChat().getText();
    }

    public void nuevaPartida(String Partida, String ip) throws RemoteException {
        puerto.add((puerto.get(puerto.size()-1))+1);
        this.ip.add(ip);
        this.partidas.add(Partida);
         gs.getJtPartidas().append("\n");
       gs.getJtPartidas().append(Partida);
        
    }

    public ConsultaEstadisticas getCe() {
        return ce;
    }

    public void setCe(ConsultaEstadisticas ce) {
        this.ce = ce;
    }

    public String getEstaIP() {
        return estaIP;
    }

    public void setEstaIP(String estaIP) {
        this.estaIP = estaIP;
    }

    public int getEstePuerto() {
        return estePuerto;
    }

    public void setEstePuerto(int estePuerto) {
        this.estePuerto = estePuerto;
    }

    public static HomeAdmin getGs() {
        return gs;
    }

    public static void setGs(HomeAdmin gs) {
        RmiServidor.gs = gs;
    }

    public ArrayList<String> getIp() {
        return ip;
    }

    public void setIp(ArrayList<String> ip) {
        this.ip = ip;
    }

    public Login getLn() {
        return ln;
    }

    public void setLn(Login ln) {
        this.ln = ln;
    }

    public ArrayList<String> getPartidas() {
        return partidas;
    }

    public void setPartidas(ArrayList<String> partidas) {
        this.partidas = partidas;
    }

    public ArrayList<Integer> getPuerto() {
        return puerto;
    }

    public void setPuerto(ArrayList<Integer> puerto) {
        this.puerto = puerto;
    }

    public Registry getRegistro() {
        return registro;
    }

    public void setRegistro(Registry registro) {
        this.registro = registro;
    }

    public boolean isTModalidad() {
        return tModalidad;
    }

    public void setTModalidad(boolean tModalidad) {
        this.tModalidad = tModalidad;
    }

    public ArrayList<String> actualizarp() throws RemoteException {
        return this.partidas;
    }

    public ArrayList<String> ips() throws RemoteException {
        return this.ip;
    }

    public ArrayList<Integer> puerto() throws RemoteException {
        return this.puerto;
    }

    
    //-------------------------------------------------------------------------------//
}
